/*!
 *  \file       ParametricSignalGenerator.cpp
 *  \brief      Implementazione della classe \c ParametricSignalGenerator
 *  \author     Davide Scola <S2299453@studenti.unige.it>
 *  \author	Minetti Alberto <S3064777@studenti.unige.it>
 *  \version    1.0
 *
 */
#include <cmath>
#include "ISignalGenerator.hpp"
#include "ParametricSignalGenerator.hpp"

using namespace std;


/*!
 *  \brief	Costruttore della classe \c ParametricSignalGenerator
 *
 *  \see	ParametricSignalGenerator< tType >::ParametricSignalGenerator( ParametricSignalGenerator< tType > const& other )
 */
template< class tType, unsigned long int T >
ParametricSignalGenerator< tType, T >::ParametricSignalGenerator( const unsigned long int nItems )
{
  this->currPoint_ = tType( T ) * tType( -1 );
  this->iStep_ = tType( 2 ) * ( tType )( T ) / tType( nItems );
}

/*!
 *  \brief      Costruttore di copia della classe \c ParametricSignalGenerator
 *  \param[in]	other	generatore da copiare
 *
 *  \see	ParametricSignalGenerator< tType >::ParametricSignalGenerator( const unsigned long int nItems )
 */
template< class tType, unsigned long int T >
ParametricSignalGenerator< tType, T >::ParametricSignalGenerator( ParametricSignalGenerator< tType, T > const& other )
{
  this->currPoint_ = (&other)->currPoint_;
  this->iStep_ = (&other)->iStep_;
}


/*!
 *  \brief      Operatore di assegnazione della classe \c ParametricSignalGenerator
 */
template < typename tType, unsigned long int T > ParametricSignalGenerator< tType, T >&
ParametricSignalGenerator< tType, T >::operator=( const ParametricSignalGenerator& other )
{
   if (this == &other) {
       return *this;
   }
   
   this->currPoint_ = (&other)->currPoint_;
   this->iStep_ = (&other)->iStep_;
   
   return *this;
}


/*!
 *  \brief      Generatore del segnale
 *  \return	ritorna un segnale descritto dalla funzione
 */
template< class tType, unsigned long int T > tType
ParametricSignalGenerator< tType, T >::operator() ( void )
{
  tType swap = this->currPoint_;
  
  this->currPoint_ += this->iStep_;
  return tType( 1 + 2 * sqrt( pow( T, tType( 2 ) ) - pow( swap, tType( 2 ) ) ) );
}
